package com.alks.function.service.impl.system;

import com.alibaba.fastjson.JSONArray;
import com.alks.common.aop.AutoPageAop;
import com.alks.common.data.thread.UserIdThread;
import com.alks.common.utils.beanutils.StringUtils;
import com.alks.entity.data.entity.sys.SysConfLang;
import com.alks.entity.data.entity.sys.SysConfig;
import com.alks.entity.exception.ParamErrorException;
import com.alks.function.data.vo.sys.LangTypeVO;
import com.alks.function.data.request.sys.ConfigLangRequest;
import com.alks.function.data.vo.stock.PageDataVO;
import com.alks.function.mapper.system.SysConfLangMapper;
import com.alks.function.service.system.ISysConfLangService;
import com.alks.function.service.system.ISysConfigService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.Page;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: chen
 * @date: 2024/12/25
 * @description:
 */
@Service
public class SysConfLangServiceImpl implements ISysConfLangService {

    @Resource
    private SysConfLangMapper sysConfLangMapper;

    @Resource
    private ISysConfigService sysConfigService;

    final static private String CONFIG_KEY = "config.lang.type";
    final static private String DOT = ".";

    public List<LangTypeVO> configType() {
        List<LangTypeVO> res = new ArrayList<>();
        List<String> list;
        String jsonStr = sysConfigService.selectConfigByKey(CONFIG_KEY);
        if (!StringUtils.isEmpty(jsonStr)) {
            list = JSONArray.parseArray(jsonStr, String.class);
        } else {
            list = new ArrayList<>();
            list.add("COMMON");
            list.add("OPERATE");
            list.add("BUSINESS");
            list.add("ORDER");
            list.add("SHIPPING");
            list.add("EXPLOIT");
            list.add("TECH");
            list.add("PROD_CTL");
            list.add("PURCHASE");
            list.add("STORAGE");
            list.add("FINISH_CTL");
            list.add("FINANCE");
            list.add("PRODUCT");
            list.add("OA");
            list.add("OTHER");

            SysConfig sysConfig = new SysConfig();
            sysConfig.setConfigKey(CONFIG_KEY);
            sysConfig.setConfigType("N");
            sysConfig.setConfigName("语言分类配置");
            sysConfig.setRemark("谨慎编辑！！！");
            sysConfig.setConfigValue(JSONArray.toJSONString(list));
            sysConfigService.saveConfig(sysConfig);
        }
        for (String s : list) {
            res.add(new LangTypeVO(s, null));
        }


        return res;
    }

    @Override
    public Boolean saveConfig(SysConfLang sysConfLang) {
        boolean success = false;
        if (sysConfLang.getId() != null) {
            LambdaUpdateWrapper<SysConfLang> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.set(SysConfLang::getZh, sysConfLang.getZh());
            updateWrapper.set(SysConfLang::getEn, sysConfLang.getEn());
            updateWrapper.set(SysConfLang::getVnm, sysConfLang.getVnm());
            updateWrapper.set(SysConfLang::getUpdateBy, UserIdThread.get().getUserName());
            updateWrapper.set(SysConfLang::getUpdateDate, LocalDateTime.now());
            updateWrapper.eq(SysConfLang::getId, sysConfLang.getId());
            success = sysConfLangMapper.update(null, updateWrapper) > 0;
        } else {
            List<LangTypeVO> langTypeVOS = configType().stream()
                    .filter(e -> e.getCode().equals(sysConfLang.getType())).collect(Collectors.toList());
            if (langTypeVOS.isEmpty()) {
                throw new ParamErrorException("分类有误");
            }
            if (StringUtils.isEmpty(sysConfLang.getCode()) || !sysConfLang.getCode().matches("^[a-zA-Z0-9]+$")) {
                throw new ParamErrorException("编码为空或格式有误");
            }
            String code = sysConfLang.getType() + DOT + sysConfLang.getCode();
            LambdaQueryWrapper<SysConfLang> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SysConfLang::getCode, code);
            if (sysConfLangMapper.selectCount(queryWrapper) > 0) {
                throw new  ParamErrorException("编码已存在");
            }

            if (StringUtils.isEmpty(sysConfLang.getZh()) || StringUtils.isEmpty(sysConfLang.getEn())
                    || StringUtils.isEmpty(sysConfLang.getVnm())) {
                throw new ParamErrorException("缺少必要参数");
            }

            sysConfLang.setStatus(1);
            sysConfLang.setCode(code.toUpperCase());
            sysConfLang.setUpdateBy(UserIdThread.get().getUserName());
            sysConfLang.setUpdateDate(LocalDateTime.now());
            success = sysConfLangMapper.insert(sysConfLang) > 0;
        }
        return success;
    }

    @Override
    @AutoPageAop
    public PageDataVO<SysConfLang> termPage(ConfigLangRequest request) {
        PageDataVO<SysConfLang> res = new PageDataVO<>();
        LambdaQueryWrapper<SysConfLang> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysConfLang::getStatus, 1);
        queryWrapper.likeRight(!StringUtils.isEmpty(request.getType()), SysConfLang::getCode, request.getType());
        if (!StringUtils.isEmpty(request.getCode())) {
            queryWrapper.apply("SUBSTRING_INDEX(code, '.', -1) LIKE {0}", "%" + request.getCode() + "%");
        }
        if (!StringUtils.isEmpty(request.getValue())) {
            queryWrapper.and(e -> {
                e.like(SysConfLang::getZh, request.getValue());
                e.or().like(SysConfLang::getEn, request.getValue());
                e.or().like(SysConfLang::getVnm, request.getValue());
                return e;
            });
        }
        List<SysConfLang> list = sysConfLangMapper.selectList(queryWrapper);
        for (SysConfLang lang : list) {
            String code = lang.getCode();
            String type = null;
            if (code.contains(DOT)) {
                type = code.split("\\" + DOT)[0];
                code = code.substring(type.length() + 1);
            }
            lang.setType(type);
            lang.setCode(code);
        }
        res.setRows(list);
        Page<SysConfLang> page = (Page<SysConfLang>) list;
        res.setTotal(page.getTotal());
        return res;
    }

    /**
     * 数据可能被引用，不可物理删除
     */
    @Override
    public Boolean deleteConfig(List<Long> ids) {
        LambdaUpdateWrapper<SysConfLang> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(SysConfLang::getStatus, 2);
        updateWrapper.in(SysConfLang::getId, ids);
        return sysConfLangMapper.update(null, updateWrapper) > 0;
    }

    @Override
    public List<SysConfLang> listAll() {
        return sysConfLangMapper.selectList(Wrappers.emptyWrapper());
    }
}
